package com.crm.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.crm.entity.AutoConfig;
import com.crm.entity.Sign;
import com.crm.entity.Student;
import com.crm.entity.User;
import com.crm.service.AutoConfigService;
import com.crm.service.SignService;
import com.crm.service.StudentService;
import com.crm.service.UserService;
import com.crm.util.*;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author crm
 * @since 2020-06-05
 */
@RestController//标注当前类是controller类，controller用 于处理客户端请求，加Rest表示当前类的所有方法都返回json数据，不走视图
@RequestMapping("/student")
public class StudentController {
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private StudentService studentService;//student的业务层父接口
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private AutoConfigService autoConfigService;//autoConfig的业务层父接口
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private UserService userService;//User的业务层父接口
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private SignService signService;//sign的业务层父接口
    @RequestMapping("getStu")// 客户端请求地址
    public Object getAllStudent(Student student, Page<Student> page,Integer uid,String dataEntryClerk,@RequestParam("rid") String[] rid) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        for(String ids:rid){
            if(ids.equals("2")){
                IPage<Student> allTrack = studentService.getStudent(page, student);
                return new Result(0, "", allTrack.getRecords(), allTrack.getTotal());
            }else {
                student.setUid(uid);
                student.setDataEntryClerk(dataEntryClerk);
                IPage<Student> allTrack = studentService.getAllStudent(page, student, uid, dataEntryClerk);
                return new Result(0, "", allTrack.getRecords(), allTrack.getTotal());
            }
        }
        return new Result(0, "");
    }

    /**
     * 添加学生是了解是否自动分配给用户
     * 添加时拿到权重最大的待分配用户
     * 如果存在添加用户，并且添加成功时修改用户分配状态为已分配，如果不存在让所有用户的分配
     * 状态为待分配
     * 第一步：判断是否开始自动分配 1开启 0关闭
     * 第二步：当分配撞他等于0时，查询咨询师，循环添加给已签到的咨询师
     * 第三步：判断咨询师是否已经打卡，如果没有查到待分配，循坏修改是否分配，
     * 此时咨询师全部为待分配进行查询，添加学生时给学生添加咨询师，进行添加
     * 成功判断，成功后修改咨询师的状态为已分配

     * @param stu
     * @return
     */
    @RequestMapping("createStu")// 客户端请求地址
    public Object createStu(Student stu){
        AutoConfig byId = autoConfigService.getOne(new QueryWrapper<AutoConfig>().eq("aid", 1));
        // 判断是否开启自动分配0：开启1：关闭
        if (byId.getIsAutoConfig() == 0) {

            //查询咨询师
            List<Sign> getzixunshi1 = signService.list(null);
            // 获取集合中的属性添加到数组中
            List<String> str1 = new ArrayList<String>();
            List<Integer> str = new ArrayList<Integer>();

            //循环添加给已签到的咨询师
            for (int i = 0; i < getzixunshi1.size(); i++) {

                str1.add(i, getzixunshi1.get(i).getSignState());
                if (getzixunshi1.get(i).getSignState().equals("已签到")) {
                    str.add(i, getzixunshi1.get(i).getUid());
                } else {
                    str.add(i, 0);
                }
            }

            //判断咨询师存在已打卡
            if (str1.contains("已签到")) {
                //查询待分配的咨询师
                Sign one2 = signService.getOne(new QueryWrapper<Sign>().eq("is_distribute", 1));
                //如果没查到待分配，
                if (one2 == null) {
                    //循环修改是否分配
                    signService.updateOpenButton(str, 1);
                    //此时咨询师全部为待分配进行行查询
                    Sign one3 = signService.getOne(new QueryWrapper<Sign>().eq("is_distribute", 1));
                    Integer userId3 = one3.getUid();
                    stu.setUid(userId3);
                    //添加学生时给学生添加咨询师
                    boolean save = studentService.save(stu);
                    if (save) {
                        Sign sign = new Sign();
                        sign.setIsDistribute(0);
                        signService.update(sign, new QueryWrapper<Sign>().eq("uid", userId3));
                        return new Result(0, "添加成功");
                    }
                    return new Result(1, "添加失败");
                } else {
                    Integer userId = one2.getUid();
                    stu.setUid(userId);
                    boolean save = studentService.save(stu);
                    if (save) {
                        Sign sign = new Sign();
                        sign.setIsDistribute(0);

                        //修改咨询师状态为已分配
                        signService.update(sign, new QueryWrapper<Sign>().eq("uid", userId));
                        return new Result(0, "添加成功");
                    }
                    return new Result(1, "添加失败");
                }
            } else {
                boolean save = studentService.save(stu);
                if (save) {
                    return new Result(0, "添加成功");
                }
                return new Result(1, "添加失败");
                //未获取到已打卡的咨询师
            }
        } else {
            boolean save = studentService.save(stu);
            if (save) {
                return new Result(0, "添加成功");
            }
            return new Result(1, "添加失败");
        }

    }
    @RequestMapping("deleteStu")// 客户端请求地址
    public Object deleteStu(Integer stuId){
        boolean i = studentService.removeById(stuId);//调用mybatis plus的内 置service层方法removeById()，删除数据
        if (i == true) {
            return new Result(0, "删除成功");
        }
        return new Result(1, "删除失败");
    }
    @RequestMapping("updateStu")// 客户端请求地址
    public Object UpdateStu(Student stu){
        boolean i=studentService.updateById(stu);//调用mybatis plus的内 置service层方法updateById()，修改数据
        if (i == true) {
            return new Result(0, "修改成功");
        }
        return new Result(1, "修改失败");
        }

    @RequestMapping("updateByStuId")// 客户端请求地址
    public Object updateByStuId(String ids,Integer uid){
        String[] stuId=ids.split(",");
        int i=studentService.updateByStuId(stuId, uid);//调用ervice层方法updateByStuId()，修改数据
        if (i>0) {
            return new Result(0, "修改成功");
        }
        return new Result(1, "修改失败");
    }
    @RequestMapping("exportStudent")// 客户端请求地址
    public void exportStu(HttpServletResponse response, String[] ids ) throws IOException {
            String downloadName = "学生表.xls";
            response.setCharacterEncoding("UTF-8");// 设置响应的字符编码格式
            response.setContentType("application/vnd.ms-excel");// 指明响应文件为excel类型
            response.setHeader("Content-disposition",
                    "attachment;filename=" + new String(downloadName.getBytes("GB2312"), "ISO8859-1"));// 文件名编码处理，防止浏览器下载文件名乱码
            ServletOutputStream out = response.getOutputStream();
            List<Student> list = new ArrayList<Student>();
            if (ids != null && !ids.equals("")) {
                list = studentService.exportStudent(ids);
                System.out.println("选中学生的集合=>" + list);
            }
            try {

                PoiUtils p = new PoiUtils();
                p.createExcel(list, Student.class, out);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

}
